/**
 * 存储策略配置
 * 
 * 根据用户选择动态决定使用 localStorage 还是 sessionStorage
 */

// 默认配置：是否记住登录状态
export const REMEMBER_ME_DEFAULT = true

// 是否允许用户选择"记住我"
export const REMEMBER_ME_ENABLED = true

// LocalStorage Key
const REMEMBER_ME_KEY = 'kexio-remember-me'

/**
 * 获取用户的"记住我"选择
 */
export function getRememberMe(): boolean {
  try {
    const saved = localStorage.getItem(REMEMBER_ME_KEY)
    return saved !== null ? saved === 'true' : REMEMBER_ME_DEFAULT
  } catch {
    return REMEMBER_ME_DEFAULT
  }
}

/**
 * 设置用户的"记住我"选择
 */
export function setRememberMe(remember: boolean): void {
  try {
    localStorage.setItem(REMEMBER_ME_KEY, String(remember))
  } catch (e) {
    console.warn('设置"记住我"失败:', e)
  }
}

/**
 * 根据"记住我"选择，返回对应的存储对象
 * 
 * @returns localStorage 或 sessionStorage
 */
export function getStorage(): Storage {
  const rememberMe = getRememberMe()
  return rememberMe ? localStorage : sessionStorage
}

/**
 * 清除所有认证相关的存储数据（登出时调用）
 */
export function clearAuthStorage(): void {
  const keys = [
    'kexio-user-store',
    'kexio-permission-store',
    'kexio-app-store'
  ]
  
  // 从两种存储中都清除
  keys.forEach(key => {
    try {
      localStorage.removeItem(key)
      sessionStorage.removeItem(key)
    } catch (e) {
      console.warn(`清除存储失败: ${key}`, e)
    }
  })
}

/**
 * 迁移存储数据（当用户切换"记住我"选项时）
 * 
 * @param toRemember 是否记住登录
 */
export function migrateStorage(toRemember: boolean): void {
  const sourceStorage = toRemember ? sessionStorage : localStorage
  const targetStorage = toRemember ? localStorage : sessionStorage
  
  const keys = [
    'kexio-user-store',
    'kexio-permission-store',
    'kexio-app-store'
  ]
  
  keys.forEach(key => {
    try {
      const value = sourceStorage.getItem(key)
      if (value) {
        targetStorage.setItem(key, value)
        sourceStorage.removeItem(key)
      }
    } catch (e) {
      console.warn(`迁移存储失败: ${key}`, e)
    }
  })
}

/**
 * 应用启动时检查"记住我"选项
 * 
 * 如果用户上次登录时未勾选"记住我"，则清除所有认证相关数据
 * 这样可以实现：关闭浏览器后，下次打开时需要重新登录
 */
export function checkRememberMeOnStartup(): void {
  try {
    const rememberMe = getRememberMe()
    
    // ✅ 检查 token 是否真实存在（从 localStorage 或 Cookie）
    const hasToken = !!(localStorage.getItem('kexio-token') || 
                        document.cookie.includes('kexio-token='))
    
    // 情况1：用户选择不记住登录 → 清除所有数据
    if (!rememberMe) {
      console.log('💾 用户选择不记住登录，清除认证数据')
      clearAuthStorage()
      return
    }
    
    // 情况2：用户选择记住登录，但 token 不存在 → 清除过期数据
    if (!hasToken) {
      console.log('💾 Token 已失效，清除过期的路由和菜单数据')
      // 只清除 permission-store，保留 app-store（用户设置）
      try {
        localStorage.removeItem('kexio-user-store')
        localStorage.removeItem('kexio-permission-store')
        sessionStorage.removeItem('kexio-user-store')
        sessionStorage.removeItem('kexio-permission-store')
      } catch (e) {
        console.warn('清除过期数据失败:', e)
      }
      return
    }
    
    // 情况3：用户选择记住登录且 token 存在 → 保留所有数据
    console.log('💾 用户选择记住登录且 Token 有效，保留认证数据')
  } catch (e) {
    console.warn('检查"记住我"选项失败:', e)
  }
}

